package com.obelisco.vista.seguridad;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

import ucla.encuestaMatic.modelo.data.Encuesta;

import nextapp.echo2.app.Color;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;

import com.obelisco.modelo.data.CarpetaTransaccion;
import com.obelisco.modelo.data.Transaccion;
import com.obelisco.modelo.data.Usuario;

import echopointng.MenuBar;

public class MenuBarSeguridad extends MenuBar {

	private Usuario usuario;
	private CarpetaTransaccion raiz;
	private HashMap<String, Object> invokerMap;
	private boolean orientacionHorizontal = true;
	private Vector<EjecutarListener> listeners = new Vector<EjecutarListener>();
	
	public MenuBarSeguridad() {
		this.setBackground(new Color(153, 204, 255));		
	}

	public void distribuirEventoTransaccion(Transaccion transaccion) {
		for (EjecutarListener listener : listeners)
			listener.onClickTransaccion(transaccion);
	}
	
	public void distribuirEventoCarpeta(CarpetaTransaccion carpeta) {
		for (EjecutarListener listener : listeners)
			listener.onClickCarpeta(carpeta);
	}
	
	private ActionListener actionListener = new ActionListener(){

		@Override
		public void actionPerformed(ActionEvent actionEvent) {
			Object objeto = invokerMap.get(actionEvent.getActionCommand());
			if (objeto instanceof CarpetaTransaccion)
				distribuirEventoCarpeta((CarpetaTransaccion)objeto);
			else if (objeto instanceof Transaccion)
				distribuirEventoTransaccion((Transaccion)objeto);
		}		
	};
	
	private void crearMenues(MenuSeguridad padre, CarpetaTransaccion carpeta) {
		MenuSeguridad hijo = new MenuSeguridad(carpeta);		
		hijo.setActionCommand("C" + carpeta.getCodigo());
		invokerMap.put(hijo.getActionCommand(), carpeta);
		if (padre == null) {			
			if (!orientacionHorizontal) {
				hijo.setText("Menu");
				this.add(hijo);
			}
		} else
			if (padre.getCarpeta().equals(this.raiz) && this.orientacionHorizontal)
				this.add(hijo);
			else
				padre.add(hijo);
		for (Iterator i = carpeta.getHijos().iterator(); i.hasNext();) {
			CarpetaTransaccion carpetaHija = (CarpetaTransaccion) i.next();			
			crearMenues(hijo, carpetaHija);			
		}
		// Adicionamos las transacciones
		for (Transaccion transaccion : carpeta.getTransacciones()) {
			Calendar hoy = Calendar.getInstance();
			hoy.set(Calendar.HOUR_OF_DAY, 0);
			hoy.set(Calendar.MINUTE, 0);
			hoy.set(Calendar.SECOND, 0);
			hoy.set(Calendar.MILLISECOND, 0);
			Encuesta encuesta = transaccion.getEncuesta();
			if (encuesta == null || encuesta.getFechaInicio().compareTo(hoy.getTime()) <= 0 && encuesta.getFechaFin().compareTo(hoy.getTime()) >= 0) {
				MenuItemSeguridad menuItemSeguridad = new MenuItemSeguridad(transaccion);
				menuItemSeguridad.setActionCommand("T" + transaccion.getCodigo());
				invokerMap.put(menuItemSeguridad.getActionCommand(), transaccion);
				menuItemSeguridad.addActionListener(this.actionListener);
				hijo.add(menuItemSeguridad);
			}
		}
	}
	
	private void setRaiz(CarpetaTransaccion raiz) {
		this.raiz = raiz;
		removeAll();
		if (this.raiz != null) {
			invokerMap = new HashMap<String, Object>();
			crearMenues(null, this.raiz);
		}		
	}
		
	public CarpetaTransaccion getRaiz() {
		return raiz;
	}
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
		this.setRaiz(this.usuario.getFunciones());
	}

	public boolean isOrientacionHorizontal() {
		return orientacionHorizontal;
	}

	public void setOrientacionHorizontal(boolean orientacionHorizontal) {
		this.orientacionHorizontal = orientacionHorizontal;
	}

	public void addBarraMenuUsuarioListener(EjecutarListener listener) {
		listeners.add(listener);
	}

	public void removeBarraMenuUsuarioListener(EjecutarListener listener) {
		listeners.remove(listener);
	}

}
